package kr.co.happenstance.util;

import java.util.*;

import android.app.*;
import android.content.*;
import android.content.res.Configuration;
import android.graphics.*;
import android.graphics.drawable.ColorDrawable;
import android.location.Address;
import android.location.Geocoder;
import android.net.*;
import android.telephony.*;
import android.util.*;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.*;

/**
 * 안드로이드 관련 Utility 클래스
 * @author Administrator
 *
 */
public class AndroidUtil {
	private final static String TAG = "<<<AndroidUtil>>>";
	
	/**
	 * 주어진 name의 sharedPreferences 에서 주어진 key값으로 value값 저장 메소드
	 * 
	 * @param context
	 * @param sharedPreferenceName
	 * @param key
	 * @param value
	 */
	public static void setAppPreferences(Context context, String name, String key, String value) {
		SharedPreferences pref = null;
		pref = context.getSharedPreferences(name, 0);
		SharedPreferences.Editor prefEditor = pref.edit();
		
		prefEditor.putString(key, value);
		prefEditor.commit();
	}
	
	/**
	 * 주어진 name의 sharedPreferences 에서 주어진 key값의 value값 가져오는 메소드
	 * 
	 * @param context
	 * @param sharedPreferencesName
	 * @param key
	 * @return
	 */
	public static String getAppPreferences(Context context, String name, String key) {
		String returnValue = null;
		SharedPreferences pref = null;
		
		pref = context.getSharedPreferences(name, 0);
		returnValue = pref.getString(key, "");
		return returnValue;
	}	
	
	/**
	 * TextView Font를 App Typeface 값으로 셋팅하는 메소드
	 * 
	 * @param tv
	 */
	public static void setTextViewAppFontTypeface(TextView tv){
		tv.setTypeface(getAppFontTypeFace());
	}
	
	/**
	 * App Typeface 가져오는 메소드
	 * 
	 * @return
	 */
	public static Typeface getAppFontTypeFace(){
		return Typeface.DEFAULT;
	}
	
	/**
	 * 네트웍 사용 가능 여부 체크 메소드
	 * 
	 * @param context
	 * @return
	 */
	public static boolean isNetworkConnectionAvailable(Context context) {  
	    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
	    NetworkInfo info = cm.getActiveNetworkInfo();     
	    if (info == null) return false;
	    NetworkInfo.State network = info.getState();
	    return (network == NetworkInfo.State.CONNECTED || network == NetworkInfo.State.CONNECTING);
	}
	
	/**
	 * 주어진 url로 외부브라우저 호출 메소드
	 * 
	 * @param url
	 */
	public static void invokeExternalBrowser(Activity activity, String url){
		invokeExternalBrowser(activity, url, false);
	}
	
	/**
	 * 주어진 url로 외부브라우저 호출 메소드
	 * 
	 * @param activity
	 * @param url
	 * @param newTaskFlag
	 */
	public static void invokeExternalBrowser(Activity activity, String url, boolean newTaskFlag){
		Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
		if(newTaskFlag){
			i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
		}
		activity.startActivity(i);
	}
	
	/**
	 * 주어진 url로 외부브라우저 호출 메소드
	 * 
	 * @param activity
	 * @param url
	 * @param intentFlags
	 */
	public static void invokeExternalBrowser(Activity activity, String url, int...intentFlags){
		Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
		for(int flag: intentFlags){
			i.addFlags(flag);
		}
		activity.startActivity(i);
	}
	
	/**
	 * 전화 걸기 메소드
	 * 
	 * @param activity
	 * @param phoneNumber
	 */
	public static void invokeCall(Context context, String phoneNumber){
		try{
			context.startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+ phoneNumber)));			
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	/**
	 * 전화 걸기 메소드
	 * 
	 * @param activity
	 * @param phoneNumber
	 */
	public static void invokeCall(Activity activity, String phoneNumber){
		invokeCall(activity.getApplicationContext(), phoneNumber);
	}	
	
	/**
	 * 단말기 UUID 생성 메소드
	 * 
	 * @param context
	 * @return
	 */
	public static String createUUID(Context context) {
		final TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); 
		final String tmDevice = "" + tm.getDeviceId(); 
		final String tmSerial = "" + tm.getSimSerialNumber(); 
		final String androidId = "" + android.provider.Settings.Secure.getString(context.getContentResolver(), android.provider.Settings.Secure.ANDROID_ID); 
		UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode());
		return deviceUuid.toString();
	}		
	
	/**
	 * arrays.xml에 있는 요소중 resId에 해당하는 string-array요소를 
	 * String 배열로 리턴 하는 메소드
	 * 
	 * @param context
	 * @param resId
	 * @return
	 */
	public static String[] getStringArray(Context context, int resId){
		return context.getResources().getStringArray(resId);
	}
	
	/**
	 * arrays.xml에 있는 요소중 resId에 해당하는 integer-array요소를 
	 * int 배열로 리턴 하는 메소드
	 * 
	 * @param context
	 * @param resId
	 * @return
	 */	
	public static int[] getIntArray(Context context, int resId){
		return context.getResources().getIntArray(resId);
	}
	
	/**
	 * 현재 Device 의 메모리 출력 메소드
	 */
	public static void showMem(){
		//Dalvik heap 영역 최대 크기(프로세스당 메모리 한계)
		Log.d(TAG, "Max Memory["+Runtime.getRuntime().maxMemory()+"]");
		
		//Dalvik heap 영역 크기
		Log.d(TAG, "Total Memory["+Runtime.getRuntime().totalMemory()+"]");
		
		//Dalvik heap free 크기
		Log.e(TAG, "Free Memory["+(Runtime.getRuntime().freeMemory()/1024)+"K]");
		
		//Dalvik heap allocated 크기
		Log.d(TAG, "Allocated Memory["+(Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory())+"]");
	}
	
	/**
	 * 현재 Application의 언어설정 메소드<br><br>
	 * 
	 * @param context		
	 * @param lang			ISO 639 α-2 또는 α-3 언어 코드
	 */
	public static void setLocale(Context context, String lang){
		Log.d(TAG, "lang["+lang+"]");
		
		Locale locale = new Locale(lang);
		Locale.setDefault(locale);
		Configuration config = new Configuration();
		config.locale = locale;
		context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
	}
	
	
	/**
	 * 특정 ViewGroup 내 모든 View 활성, 비활성 시키는 메소드
	 * 
	 * @param enable
	 * @param vg
	 */
	public static void disableEnableControls(boolean enable, ViewGroup vg){
		for (int i = 0; i < vg.getChildCount(); i++){
			View child = vg.getChildAt(i);
			child.setEnabled(enable);
			if(child instanceof ViewGroup){ 
				disableEnableControls(enable, (ViewGroup)child);
			}
		}
	}	
	
	/**
	 * 주어진 View로 팝업 다이얼로그 생성및 보여 주는 메소드
	 * 
	 * @param context
	 * @param layout
	 * @param cancelable
	 */
	public static Dialog getPopupDialog(Context context, View layout, boolean cancelable){
		Dialog dialog = new Dialog(context);
		dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
		dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
		dialog.setContentView(layout);
		dialog.setCancelable(cancelable);
		return dialog;
	}
	
	/**
	 * 주어진 Activity를 리스타트 시키는 메소드
	 * 
	 * @param act
	 */
	public static void restartActivity(Activity act){
		Intent intent = act.getIntent();
		act.finish();
		act.startActivity(intent);			
	}
	
	/**
	 * 위도,경도로 주소 가져오는 메소드
	 * 
	 * @param context 
	 * @param locale
	 * @param lat
	 * @param lng
	 * @return
	 */
	public static String getAddress(Context context, Locale locale, double lat, double lng){
		String currentLocationAddress = "";
		try{
			Geocoder geocoder = new Geocoder(context, locale);
			List<Address> address;
			if(geocoder != null){
				address = geocoder.getFromLocation(lat, lng, 1);
				if(address != null && address.size() > 0){
					currentLocationAddress = address.get(0).getAddressLine(0).toString();
				}
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		return currentLocationAddress;
	}
	
	public static boolean isRunningProcess(Context context, String packageName) {
		boolean isRunning = false;
		
		Log.d(TAG, "packageName["+packageName+"]");
		
		ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
		List < ActivityManager.RunningTaskInfo > taskInfo = am.getRunningTasks(1);
		Log.d(TAG, "CURRENT Activity ::" + taskInfo.get(0).topActivity.getClass().getSimpleName());
		
		ComponentName componentInfo = taskInfo.get(0).topActivity;
		if(componentInfo.getPackageName().equalsIgnoreCase(packageName)){
			isRunning = true;
		}
			
		
		return isRunning;
	}
	
	
}
